package usbcali.edu.co.pqrs.presentation.backingBeans;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;

import usbcali.edu.co.pqrs.exceptions.ZMessManager;
import usbcali.edu.co.pqrs.modelo.AnexosPqr;
import usbcali.edu.co.pqrs.modelo.AnxsXTpSol;
import usbcali.edu.co.pqrs.modelo.TipoSolicitudPqr;
import usbcali.edu.co.pqrs.modelo.dto.AnexosPqrDTO;
import usbcali.edu.co.pqrs.modelo.dto.AnxsXTpSolDTO;
import usbcali.edu.co.pqrs.modelo.dto.TipoSolicitudPqrDTO;
import usbcali.edu.co.pqrs.presentation.businessDelegate.IBusinessDelegatorView;
import usbcali.edu.co.pqrs.utilities.FacesUtils;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * 
 */
@ManagedBean
@ViewScoped
public class AnxsXTpSolView implements Serializable {
	private static final long serialVersionUID = 1L;

	private Long anexo;
	private Long tipoSolicitudPqr;
	private String esObligatorio;
	private SelectOneMenu estado;
	private SelectOneMenu txtTipoSolicitud;
	private SelectOneMenu txtAnexo;
	private Map<String, String> losItemsTipoSolicitud = new HashMap<String, String>();
	private Map<String, String> losItemsAnexo = new HashMap<String, String>();
	private CommandButton btnBack;
	List<AnexosPqrDTO> data2;
	List<TipoSolicitudPqrDTO> data3;

	private InputText txtEsObligatorio;
	private InputText txtIdAnexoPqr_AnexosPqr;
	private InputText txtIdTpSolPqr_TipoSolicitudPqr;
	private InputText txtIdAnexoXTpSol;
	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;
	private List<AnxsXTpSolDTO> data;
	private AnxsXTpSolDTO selectedAnxsXTpSol;
	private AnxsXTpSol entity;
	private boolean showDialog;
	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;

	private SelectItem[] manufacturerOptions;
	String manufacturers[] = { "S", "N" };

	public AnxsXTpSolView() {
		super();
		setManufacturerOptions(createFilterOptions(manufacturers));

	}

	private SelectItem[] createFilterOptions(String[] data) {
		SelectItem[] options = new SelectItem[data.length + 1];

		options[0] = new SelectItem("", "Seleccionar");
		for (int i = 0; i < data.length; i++) {
			options[i + 1] = new SelectItem(data[i], data[i]);
		}

		return options;
	}

	public void rowEventListener(RowEditEvent e) {
		try {
			AnxsXTpSolDTO anxsXTpSolDTO = (AnxsXTpSolDTO) e.getObject();

			if (txtEsObligatorio == null) {
				txtEsObligatorio = new InputText();
			}

			txtEsObligatorio.setValue(anxsXTpSolDTO.getEsObligatorio());

			if (txtIdAnexoPqr_AnexosPqr == null) {
				txtIdAnexoPqr_AnexosPqr = new InputText();
			}

			txtIdAnexoPqr_AnexosPqr.setValue(anxsXTpSolDTO
					.getIdAnexoPqr_AnexosPqr());

			if (txtIdTpSolPqr_TipoSolicitudPqr == null) {
				txtIdTpSolPqr_TipoSolicitudPqr = new InputText();
			}

			txtIdTpSolPqr_TipoSolicitudPqr.setValue(anxsXTpSolDTO
					.getIdTpSolPqr_TipoSolicitudPqr());

			if (txtAnexo == null) {
				txtAnexo = new SelectOneMenu();
			}
			txtAnexo.setValue(anxsXTpSolDTO.getIdAnexoPqr_AnexosPqr());

			if (txtTipoSolicitud == null) {
				txtTipoSolicitud = new SelectOneMenu();
			}

			txtTipoSolicitud.setValue(anxsXTpSolDTO
					.getIdTpSolPqr_TipoSolicitudPqr());

			if (txtIdAnexoXTpSol == null) {
				txtIdAnexoXTpSol = new InputText();
			}

			txtIdAnexoXTpSol.setValue(anxsXTpSolDTO.getIdAnexoXTpSol());

			Long idAnexoXTpSol = FacesUtils.checkLong(txtIdAnexoXTpSol);
			entity = businessDelegatorView.getAnxsXTpSol(idAnexoXTpSol);

			action_modify();
		} catch (Exception ex) {
		}
	}

	public String action_new() {
		action_clear();
		selectedAnxsXTpSol = null;
		setShowDialog(true);

		return "";
	}

	public String action_clear() {
		entity = null;
		selectedAnxsXTpSol = null;

		if (txtEsObligatorio != null) {
			txtEsObligatorio.setValue(null);
			txtEsObligatorio.setDisabled(true);
		}

		if (txtIdAnexoPqr_AnexosPqr != null) {
			txtIdAnexoPqr_AnexosPqr.setValue(null);
			txtIdAnexoPqr_AnexosPqr.setDisabled(true);
		}

		if (txtIdTpSolPqr_TipoSolicitudPqr != null) {
			txtIdTpSolPqr_TipoSolicitudPqr.setValue(null);
			txtIdTpSolPqr_TipoSolicitudPqr.setDisabled(true);
		}

		if (txtIdAnexoXTpSol != null) {
			txtIdAnexoXTpSol.setValue(null);
			txtIdAnexoXTpSol.setDisabled(false);
		}

		if (btnSave != null) {
			btnSave.setDisabled(true);
		}

		if (btnDelete != null) {
			btnDelete.setDisabled(true);
		}

		return "";
	}

	public String action_back() {

		return "initialMenu.xhtml?faces-redirect=true";
	}

	public void listener_txtId() {
		try {
			Long idAnexoXTpSol = FacesUtils.checkLong(txtIdAnexoXTpSol);
			entity = (idAnexoXTpSol != null) ? businessDelegatorView
					.getAnxsXTpSol(idAnexoXTpSol) : null;
		} catch (Exception e) {
			entity = null;
		}

		if (entity == null) {
			txtEsObligatorio.setDisabled(false);
			txtIdAnexoPqr_AnexosPqr.setDisabled(false);
			txtIdTpSolPqr_TipoSolicitudPqr.setDisabled(false);
			txtIdAnexoXTpSol.setDisabled(false);
			btnSave.setDisabled(false);
		} else {
			txtEsObligatorio.setValue(entity.getEsObligatorio());
			txtEsObligatorio.setDisabled(false);
			txtIdAnexoPqr_AnexosPqr.setValue(entity.getAnexosPqr()
					.getIdAnexoPqr());
			txtIdAnexoPqr_AnexosPqr.setDisabled(false);
			txtIdTpSolPqr_TipoSolicitudPqr.setValue(entity
					.getTipoSolicitudPqr().getIdTpSolPqr());
			txtIdTpSolPqr_TipoSolicitudPqr.setDisabled(false);
			txtIdAnexoXTpSol.setValue(entity.getIdAnexoXTpSol());
			txtIdAnexoXTpSol.setDisabled(true);
			btnSave.setDisabled(false);

			if (btnDelete != null) {
				btnDelete.setDisabled(false);
			}
		}
	}

	public String action_edit(ActionEvent evt) {
		selectedAnxsXTpSol = (AnxsXTpSolDTO) (evt.getComponent()
				.getAttributes().get("selectedAnxsXTpSol"));
		txtEsObligatorio.setValue(selectedAnxsXTpSol.getEsObligatorio());
		txtEsObligatorio.setDisabled(false);
		txtIdAnexoPqr_AnexosPqr.setValue(selectedAnxsXTpSol
				.getIdAnexoPqr_AnexosPqr());
		txtIdAnexoPqr_AnexosPqr.setDisabled(false);
		txtIdTpSolPqr_TipoSolicitudPqr.setValue(selectedAnxsXTpSol
				.getIdTpSolPqr_TipoSolicitudPqr());
		txtIdTpSolPqr_TipoSolicitudPqr.setDisabled(false);
		txtIdAnexoXTpSol.setValue(selectedAnxsXTpSol.getIdAnexoXTpSol());
		txtIdAnexoXTpSol.setDisabled(true);
		btnSave.setDisabled(false);
		setShowDialog(true);

		return "";
	}

	public String action_save() {
		try {
			if ((selectedAnxsXTpSol == null) && (entity == null)) {
				action_create();
			} else {
				action_modify();
			}

			data = null;
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_create() {
		try {
			entity = new AnxsXTpSol();

			AnexosPqr anexoItem = businessDelegatorView.getAnexosPqr(anexo);
			TipoSolicitudPqr tipoSolicitudPqrItem = businessDelegatorView
					.getTipoSolicitudPqr(tipoSolicitudPqr);

			entity.setEsObligatorio(esObligatorio);
			
			entity.setAnexosPqr(anexoItem);
			entity.setTipoSolicitudPqr(tipoSolicitudPqrItem);
			businessDelegatorView.saveAnxsXTpSol(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			data = businessDelegatorView.getDataAnxsXTpSol();
			RequestContext.getCurrentInstance().update("form:listaTDo");
		} catch (Exception e) {
			entity = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			if (entity == null) {
				Long idAnexoXTpSol = new Long(
						selectedAnxsXTpSol.getIdAnexoXTpSol());
				entity = businessDelegatorView.getAnxsXTpSol(idAnexoXTpSol);
			}

			entity.setEsObligatorio(FacesUtils.checkString(txtEsObligatorio));
			entity.setAnexosPqr((FacesUtils.checkLong(txtIdAnexoPqr_AnexosPqr) != null) ? businessDelegatorView
					.getAnexosPqr(FacesUtils.checkLong(txtIdAnexoPqr_AnexosPqr))
					: null);
			entity.setTipoSolicitudPqr((FacesUtils
					.checkLong(txtIdTpSolPqr_TipoSolicitudPqr) != null) ? businessDelegatorView
					.getTipoSolicitudPqr(FacesUtils
							.checkLong(txtIdTpSolPqr_TipoSolicitudPqr)) : null);
			businessDelegatorView.updateAnxsXTpSol(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_datatable(ActionEvent evt) {
		try {
			selectedAnxsXTpSol = (AnxsXTpSolDTO) (evt.getComponent()
					.getAttributes().get("selectedAnxsXTpSol"));

			Long idAnexoXTpSol = new Long(selectedAnxsXTpSol.getIdAnexoXTpSol());
			entity = businessDelegatorView.getAnxsXTpSol(idAnexoXTpSol);
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_master() {
		try {
			Long idAnexoXTpSol = FacesUtils.checkLong(txtIdAnexoXTpSol);
			entity = businessDelegatorView.getAnxsXTpSol(idAnexoXTpSol);
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public void action_delete() throws Exception {
		try {
			businessDelegatorView.deleteAnxsXTpSol(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
			data = null;
		} catch (Exception e) {
			throw e;
		}
	}

	public String action_closeDialog() {
		setShowDialog(false);
		action_clear();

		return "";
	}

	public String actionDeleteDataTableEditable(ActionEvent evt) {
		try {
			selectedAnxsXTpSol = (AnxsXTpSolDTO) (evt.getComponent()
					.getAttributes().get("selectedAnxsXTpSol"));

			Long idAnexoXTpSol = new Long(selectedAnxsXTpSol.getIdAnexoXTpSol());
			entity = businessDelegatorView.getAnxsXTpSol(idAnexoXTpSol);
			businessDelegatorView.deleteAnxsXTpSol(entity);
			data.remove(selectedAnxsXTpSol);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String esObligatorio, Long idAnexoXTpSol,
			Long idAnexoPqr_AnexosPqr, Long idTpSolPqr_TipoSolicitudPqr)
			throws Exception {
		try {
			entity.setEsObligatorio(FacesUtils.checkString(esObligatorio));
			businessDelegatorView.updateAnxsXTpSol(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			// renderManager.getOnDemandRenderer("AnxsXTpSolView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public InputText getTxtEsObligatorio() {
		return txtEsObligatorio;
	}

	public void setTxtEsObligatorio(InputText txtEsObligatorio) {
		this.txtEsObligatorio = txtEsObligatorio;
	}

	public InputText getTxtIdAnexoPqr_AnexosPqr() {
		return txtIdAnexoPqr_AnexosPqr;
	}

	public void setTxtIdAnexoPqr_AnexosPqr(InputText txtIdAnexoPqr_AnexosPqr) {
		this.txtIdAnexoPqr_AnexosPqr = txtIdAnexoPqr_AnexosPqr;
	}

	public InputText getTxtIdTpSolPqr_TipoSolicitudPqr() {
		return txtIdTpSolPqr_TipoSolicitudPqr;
	}

	public void setTxtIdTpSolPqr_TipoSolicitudPqr(
			InputText txtIdTpSolPqr_TipoSolicitudPqr) {
		this.txtIdTpSolPqr_TipoSolicitudPqr = txtIdTpSolPqr_TipoSolicitudPqr;
	}

	public InputText getTxtIdAnexoXTpSol() {
		return txtIdAnexoXTpSol;
	}

	public void setTxtIdAnexoXTpSol(InputText txtIdAnexoXTpSol) {
		this.txtIdAnexoXTpSol = txtIdAnexoXTpSol;
	}

	public List<AnxsXTpSolDTO> getData() {
		try {
			if (data == null) {
				data = businessDelegatorView.getDataAnxsXTpSol();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<AnxsXTpSolDTO> anxsXTpSolDTO) {
		this.data = anxsXTpSolDTO;
	}

	public AnxsXTpSolDTO getSelectedAnxsXTpSol() {
		return selectedAnxsXTpSol;
	}

	public void setSelectedAnxsXTpSol(AnxsXTpSolDTO anxsXTpSol) {
		this.selectedAnxsXTpSol = anxsXTpSol;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public boolean isShowDialog() {
		return showDialog;
	}

	public void setShowDialog(boolean showDialog) {
		this.showDialog = showDialog;
	}

	public void onEdit(org.primefaces.event.RowEditEvent event) {

		try {

			AnxsXTpSolDTO m = (AnxsXTpSolDTO) event.getObject();

			entity = null;
			entity = businessDelegatorView
					.getAnxsXTpSol((m.getIdAnexoXTpSol()));

			anexo = m.getIdAnexoPqr_AnexosPqr();
			tipoSolicitudPqr = m.getIdTpSolPqr_TipoSolicitudPqr();
			esObligatorio = m.getEsObligatorio();

			AnexosPqr anexoItem = businessDelegatorView.getAnexosPqr(anexo);

			TipoSolicitudPqr tipoSolicitudPqrItem = businessDelegatorView
					.getTipoSolicitudPqr(tipoSolicitudPqr);

			entity.setTipoSolicitudPqr(tipoSolicitudPqrItem);
			entity.setAnexosPqr(anexoItem);
			entity.setEsObligatorio(esObligatorio);

			businessDelegatorView.updateAnxsXTpSol(entity);

			data = businessDelegatorView.getDataAnxsXTpSol();

			RequestContext.getCurrentInstance().update("form:listaTDo");

			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void onCancel(org.primefaces.event.RowEditEvent event) {
		FacesMessage msg = new FacesMessage("Cancelado",
				((AnxsXTpSolDTO) event.getObject()).getIdAnexoXTpSol() + "");

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public Long getAnexo() {
		return anexo;
	}

	public void setAnexo(Long anexo) {
		this.anexo = anexo;
	}

	public Long getTipoSolicitudPqr() {
		return tipoSolicitudPqr;
	}

	public void setTipoSolicitudPqr(Long tipoSolicitudPqr) {
		this.tipoSolicitudPqr = tipoSolicitudPqr;
	}

	public SelectOneMenu getTxtTipoSolicitud() {
		return txtTipoSolicitud;
	}

	public void setTxtTipoSolicitud(SelectOneMenu txtTipoSolicitud) {
		this.txtTipoSolicitud = txtTipoSolicitud;
	}

	public SelectOneMenu getTxtAnexo() {
		return txtAnexo;
	}

	public void setTxtAnexo(SelectOneMenu txtAnexo) {
		this.txtAnexo = txtAnexo;
	}

	public Map<String, String> getLosItemsTipoSolicitud() {
		try {
			if (data3 == null) {
				getData3();
				for (int i = 0; i < data3.size(); i++) {
					losItemsTipoSolicitud.put(data3.get(i).getDescTpSol(),
							data3.get(i).getIdTpSolPqr() + "");

				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return losItemsTipoSolicitud;
	}

	public void setLosItemsTipoSolicitud(
			Map<String, String> losItemsTipoSolicitud) {
		this.losItemsTipoSolicitud = losItemsTipoSolicitud;
	}

	public Map<String, String> getLosItemsAnexo() {
		try {
			if (data2 == null) {
				getData2();
				for (int i = 0; i < data2.size(); i++) {
					losItemsAnexo.put(data2.get(i).getDescripcionAnexo(), data2
							.get(i).getIdAnexoPqr() + "");

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return losItemsAnexo;
	}

	public void setLosItemsAnexo(Map<String, String> losItemsAnexo) {
		this.losItemsAnexo = losItemsAnexo;
	}

	public CommandButton getBtnBack() {
		return btnBack;
	}

	public void setBtnBack(CommandButton btnBack) {
		this.btnBack = btnBack;
	}

	public List<AnexosPqrDTO> getData2() {
		try {
			if (data2 == null) {
				data2 = businessDelegatorView.getDataAnexosPqr();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return data2;
	}

	public void setData2(List<AnexosPqrDTO> data2) {
		this.data2 = data2;
	}

	public List<TipoSolicitudPqrDTO> getData3() {
		try {
			if (data3 == null) {
				data3 = businessDelegatorView.getDataTipoSolicitudPqr();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return data3;
	}

	public void setData3(List<TipoSolicitudPqrDTO> data3) {
		this.data3 = data3;
	}

	public AnxsXTpSol getEntity() {
		return entity;
	}

	public void setEntity(AnxsXTpSol entity) {
		this.entity = entity;
	}

	public SelectItem[] getManufacturerOptions() {
		return manufacturerOptions;
	}

	public void setManufacturerOptions(SelectItem[] manufacturerOptions) {
		this.manufacturerOptions = manufacturerOptions;
	}

	public String[] getManufacturers() {
		return manufacturers;
	}

	public void setManufacturers(String[] manufacturers) {
		this.manufacturers = manufacturers;
	}

	public String getEsObligatorio() {
		return esObligatorio;
	}

	public void setEsObligatorio(String esObligatorio) {
		this.esObligatorio = esObligatorio;
	}
	
	public SelectOneMenu getEstado() {
		return estado;
	}

	public void setEstado(SelectOneMenu estado) {
		this.estado = estado;
	}

}
